package com.kinghood.productcenter.common.model.dto.product;

import com.baomidou.mybatisplus.annotation.TableField;
import com.kinghood.productcenter.common.model.dao.base.BaseProductTemplateGroupDO;
import lombok.Data;
import org.aspectj.weaver.ast.Var;
import org.springframework.util.CollectionUtils;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * description
 *
 * @author zhangFanJun
 * @date 2023-12-28 19:56
 **/
@Data
public class ProductTemplateNodeDTO implements Serializable {

    /**
     * 组id
     * */
    private Long id;
    /**
     * 组id
     * */
    private Long groupId;
    /**
     * 分组code
     */
    private String groupCode;
    /**
     * 分组名称
     */
    private String groupName;
    /**
     * 是否固定项目（0：否，1：是），添加的就是非固定组
     */
    private Integer isFixed;
    /**
     * 是否支持一对多（0：否，1是）
     */
    private Integer isMultiple;
    /**
     * 排序值
     */
    private Integer sort;

    /**
     * 数据
     * */
    private List<ProductTemplateNodeDataDTO> dataList;

    /**
     * 属性
     * */
    private List<ProductTemplateNodeAttributeDTO> attributeList;

    /**
     * 子节点
     * */
    private List<ProductTemplateNodeDTO> sunNodeList;


    /**
     * 子类封装
     */
    public void handleSunNodeList(List<BaseProductTemplateGroupDO> list, ArrayList<ProductTemplateNodeDTO> allGroupList, int depth) {

        int finalDepth = depth ++;
        if(finalDepth == 10){
            return;
        }

        List<ProductTemplateNodeDTO> sunList = list.stream().
                filter(t -> Objects.equals(t.getParentId(), this.getGroupId()))
                .map(x -> {
                    ProductTemplateNodeDTO node = new ProductTemplateNodeDTO();
                    node.setId(x.getId());
                    node.setGroupId(x.getId());
                    node.setGroupCode(x.getGroupCode());
                    node.setGroupName(x.getGroupName());
                    node.setIsMultiple(x.getIsMultiple());
                    return node;
                })
                .collect(Collectors.toList());
        if (CollectionUtils.isEmpty(sunList)) {
            return;
        }
        this.setSunNodeList(sunList);
        allGroupList.addAll(sunList);

        sunList.forEach(x -> x.handleSunNodeList(list, allGroupList, finalDepth));
    }

    public void handleAttribute(List<ProductTemplateNodeAttributeDTO> all, int depth) {

        if(depth == 10){
            return ;
        }
        if(!CollectionUtils.isEmpty(this.getAttributeList())){
            all.addAll(this.getAttributeList());
        }
        if(CollectionUtils.isEmpty(this.getSunNodeList())){
            return ;
        }
        int d = depth++;
        this.getSunNodeList().forEach(x->x.handleAttribute(all, d));

    }
}
